Перейти к основному содержимому

1C:Предприятие 8.2

Перем АдресСервера;
Перем ПортСервера;
Перем ТокенАвторизации;
Перем Пакет;
Перем ИдентификаторИзображения;

// Получаем объект WinHttp.WinHttpRequest.5.1
Функция ПолучитьСоединение()
WinHttp=Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

Возврат WinHttp;

КонецФункции

// Получаем объект HTTPЗапрос
Процедура ПолучитьЗапрос(Роут, ТипКонтента, Запрос, Метод)

Если ПортСервера = 443 Тогда
Запрос.Open(Метод, "https://" + АдресСервера + "/api/" + Роут, Ложь);
Иначе
Запрос.Open(Метод, "http://" + АдресСервера + "/api/" + Роут, Ложь);
КонецЕсли;

Запрос.SetRequestHeader("Host", АдресСервера);
Запрос.SetRequestHeader("Cache-Control", "no-cache");
Запрос.SetRequestHeader("Connection", "keep-alive");
Запрос.SetRequestHeader("Authorization", "Bearer " + ТокенАвторизации);
Запрос.SetRequestHeader("Content-Type", ТипКонтента);
КонецПроцедуры

// Преобразование JSON строки в объект Структура
Функция JSONВСтруктуру(ТекстJSON)
//Т.к. в платформе 8.2 не реализован класс ЧтениеJSON - здесь потребуется написать парсер текста JSON в структуру.
//См. https://infostart.ru/1c/articles/1153191/
//ЧтениеJSON = Новый ЧтениеJSON();
//ЧтениеJSON.УстановитьСтроку(ТекстJSON);
//Структура = ПрочитатьJSON(ЧтениеJSON);
//ЧтениеJSON.Закрыть();
//Возврат Структура;
Возврат ТекстJSON;
КонецФункции

// Создание пакета
Функция СоздатьПакет()
Запрос = ПолучитьСоединение();
ПолучитьЗапрос("packages", "application/json", Запрос, "POST");

Запрос.Send("");

Если Запрос.Status = 200 Тогда
Возврат JSONВСтруктуру(Запрос.ResponseText);
КонецЕсли;

Возврат Неопределено;
КонецФункции

// Отправка файла в пакет
Функция ОтправитьФайл(Пакет, ИмяФайлаДляЗагрузки)
ВыбранныйФайл = Новый Файл(ИмяФайлаДляЗагрузки);
Если НЕ ВыбранныйФайл.Существует() Тогда
Сообщить("Файл не найден!");
Возврат Неопределено;
КонецЕсли;

Если ВыбранныйФайл.Расширение <> ".png"
И ВыбранныйФайл.Расширение <> ".jpg"
И ВыбранныйФайл.Расширение <> ".jpeg"
И ВыбранныйФайл.Расширение <> ".pdf" Тогда
Сообщить("Неверный формат файла!");
Возврат Неопределено;
КонецЕсли;

Запрос = ПолучитьСоединение();
ПолучитьЗапрос("images/package/" + Пакет, "application/json", Запрос, "POST");
СодержимоеФайла = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаДляЗагрузки));
СодержимоеФайла = СтрЗаменить(СодержимоеФайла, Символы.ВК, "");
СодержимоеФайла = СтрЗаменить(СодержимоеФайла, Символы.ПС, "");
Запрос.Send("{""content"":""" + СодержимоеФайла + """}");

Если Запрос.Status = 200 Тогда
Возврат JSONВСтруктуру(Запрос.ResponseText);
КонецЕсли;

Возврат Неопределено;
КонецФункции

// Запуск распознавания
Функция ЗапускРаспознавания(Пакет)
Запрос = ПолучитьСоединение();
ПолучитьЗапрос("packages/" + Пакет + "/start", "application/json", Запрос, "POST");
Запрос.Send("");

Если Запрос.Status = 204 Тогда
Возврат Истина;
КонецЕсли;

Возврат Ложь;
КонецФункции

// Получения результата распознавания
Функция РезультатРаспознавания(Пакет)
Запрос = ПолучитьСоединение();
ПолучитьЗапрос("packages/" + Пакет, "application/json", Запрос, "GET");
Запрос.Send();

Если Запрос.Status = 200 Тогда
Возврат JSONВСтруктуру(Запрос.ResponseText);
КонецЕсли;

Возврат Неопределено;
КонецФункции

// Получение перечня изображений
Функция ПереченьИзображений(Пакет)
Запрос = ПолучитьСоединение();
ПолучитьЗапрос("images/package/" + Пакет, "application/json", Запрос, "GET");
Запрос.Send();

Если Запрос.Status = 200 Тогда
Возврат JSONВСтруктуру(Запрос.ResponseText);
КонецЕсли;

Возврат Неопределено;
КонецФункции

// Скачивание выровненного изображения
Функция СкачатьИзображение(ИдИзображения)
Запрос = ПолучитьСоединение();
ПолучитьЗапрос("images/" + ИдИзображения, "application/json", Запрос, "GET");
Запрос.Send();

Если Запрос.Status = 200 Тогда
Возврат Запрос.ResponseBody;
КонецЕсли;

Возврат Неопределено;
КонецФункции

/////////////////////////////////
// Далее вызов функций с формы //
/////////////////////////////////
Процедура СоздатьПакетНажатие(Элемент = неопределено)
Результат = СоздатьПакет();
Если ЗначениеЗаполнено(Результат) Тогда
//Пакет = Результат.packageId; //см. комментарий в функции JSONВСтруктуру
Пакет = Сред(Результат, Найти(Результат,":") + 1, СтрДлина(Результат) - Найти(Результат,":") - 1);
Сообщить("Создан пакет: " + Пакет);
КонецЕсли;
КонецПроцедуры

Процедура ОтправитьФайлНажатие(Элемент = неопределено)
Результат = ОтправитьФайл(Формат(Пакет,"ЧГ=0"), "C:\file.pdf"); //Файл для распознавания
Если ЗначениеЗаполнено(Результат) Тогда
//Для Каждого ЭлементМассива из Результат.imageIds Цикл //см. комментарий в функции JSONВСтруктуру
// Сообщить("Изображение загружено, присвоен ID: " + ЭлементМассива);
//КонецЦикла;
Сообщить(Результат);
Иначе
Сообщить("Ошибка при загрузки изображения в пакет: " + Пакет);
КонецЕсли;
КонецПроцедуры

Процедура ЗапуститьРаспознаваниеНажатие(Элемент = неопределено)
Результат = ЗапускРаспознавания(Формат(Пакет,"ЧГ=0"));
Если ЗначениеЗаполнено(Результат) Тогда
Сообщить("Запущено распознование пакета " + Пакет);
Иначе
Сообщить("Ошибка при попытке запуска распознование пакета " + Пакет);
КонецЕсли;
КонецПроцедуры

Процедура РезультатыНажатие(Элемент = Неопределено)
Результат = РезультатРаспознавания(Формат(Пакет,"ЧГ=0"));
Если ЗначениеЗаполнено(Результат) Тогда
//Если Результат.state = "Recognized" Тогда //см. комментарий в функции JSONВСтруктуру
// Сообщить("Документы распознаны");
//Иначе
// Сообщить("Документы в процессе распознования");
//КонецЕсли;
Сообщить(Результат);
КонецЕсли;
КонецПроцедуры

Процедура ПереченьИзображенийНажатие(Элемент = Неопределено)
Результат = ПереченьИзображений(Формат(Пакет,"ЧГ=0"));
Если ЗначениеЗаполнено(Результат) Тогда
//Для Каждого ЭлементМассива из Результат.images Цикл //см. комментарий в функции JSONВСтруктуру
// Сообщить("Изображение ID: " + ЭлементМассива.id + " в пакете " + ЭлементМассива.PackageId);
// ИдентификаторИзображения = ЭлементМассива.id;
//КонецЦикла;
//Сообщить("Всего изображений в пакете: " + (ЭлементМассива.Количество() - 1));
Сообщить(Результат);
Иначе
Сообщить("Ошибка при попытке получения перечня изображений");
КонецЕсли;
КонецПроцедуры

Процедура СкачатьИзображениеНажатие(Элемент = Неопределено)
Результат = СкачатьИзображение(Формат(ВведитеИДизображения,"ЧГ=0"));
Если ЗначениеЗаполнено(Результат) Тогда

Stream = Новый COMОбъект("ADODB.Stream");
Stream.Type = 1;
Stream.Mode = 3;
Stream.Open();
Stream.Write(Результат);
Stream.SaveToFile("C:\processed_file.jpg");
Stream.Close();
Stream = Неопределено;

Сообщить("Файл сохранен в C:\processed_file.jpg");

Иначе
Сообщить("Ошибка при попытке скачивания изображения");
КонецЕсли;
КонецПроцедуры


// Последовательность запуска процедур
Процедура ВыполнитьВсё()
СоздатьПакетНажатие();
ОтправитьФайлНажатие();
ЗапуститьРаспознаваниеНажатие();
РезультатыНажатие();
ПереченьИзображенийНажатие();
СкачатьИзображениеНажатие();
КонецПроцедуры

// Назначение глобальный переменных
АдресСервера = "extractor.correct.su";
ПортСервера = 443;
ТокенАвторизации = "INSERT_TOKEN_HERE";

Пример программы